{
  "nbformat": 4,
  "nbformat_minor": 0,
  "metadata": {
    "colab": {
      "name": "MMDAutoTrace3.00.04.ipynb",
      "provenance": [],
      "toc_visible": true,
      "gpuType": "T4"
    },
    "kernelspec": {
      "name": "python3",
      "display_name": "Python 3"
    },
    "language_info": {
      "name": "python"
    },
    "accelerator": "GPU"
  },
  "cells": [
    {
      "cell_type": "markdown",
      "source": [
        "# Colab版MMD自動トレースv3へようこそ！(実行編)"
      ],
      "metadata": {
        "id": "Fyy5ukQ1Snmq"
      }
    },
    {
      "cell_type": "markdown",
      "source": [
        "# 始めに\n",
        "\n",
        "このツールの稼働状況やメンテナンス情報はTwitter（[@miu200521358](https://twitter.com/miu200521358)）にて行っています。\n",
        "\n",
        "エラーになる、起動しない、などの場合、まずは現在の配布状況をご確認ください。\n",
        "\n",
        "リプやDM等でのお問い合わせも受け付けています。"
      ],
      "metadata": {
        "id": "x0Du9XXeSsPi"
      }
    },
    {
      "cell_type": "markdown",
      "source": [
        "# 目次\n",
        "\n",
        "このノートブックでは、MMD自動トレースの準備と実行を行います。\n",
        "\n",
        "ノートブックの使い方にはクセがあるので、「[準備編](https://colab.research.google.com/github/miu200521358/motion_trace_colab/blob/master/AutoTraceIntroduction.ipynb)」で使い方に慣れてください。\n",
        "\n",
        "画面左上の「＝」（実際は三本線）をクリックして下さい。目次が開きます。（既に開いている場合は次へ進んでください）\n",
        "\n",
        "![目次](https://drive.google.com/uc?export=view&id=1HGk4sJmcPtMbMwcJOvE3aU1GjvKinwA_)\n",
        "\n",
        "Googleドライブの直下に`autotrace`フォルダを作成してください。\n",
        "\n",
        "（準備編で既に作られている場合は再作成不要です）\n",
        "\n",
        "ノートブックを上から順に確認し、以下手順をひとつずつ実行してください。\n",
        "\n",
        "実行が必要なセルには番号を振ってあります。①から順番に実行してください。\n",
        "\n",
        "- **「①　環境構築」**\n",
        "  - MMD自動トレースv3 用の環境を構築します。\n",
        "- **「②　MMD自動トレースv3 実行」**\n",
        "    - MMD自動トレースv3 を実行します。\n"
      ],
      "metadata": {
        "id": "CoaXwL-ASx6q"
      }
    },
    {
      "cell_type": "markdown",
      "source": [
        "# 起こる可能性のあるエラー・警告と対処方法"
      ],
      "metadata": {
        "id": "f-XzbSo-TgtU"
      }
    },
    {
      "cell_type": "markdown",
      "source": [
        "## GPU上限突破"
      ],
      "metadata": {
        "id": "aEQ4dKwATlsr"
      }
    },
    {
      "cell_type": "markdown",
      "source": [
        "下記のようなエラーが出た場合、GPUの使用量上限に達しました。\n",
        "\n",
        "無料域の場合、24時間以上待っていただくと再度利用できるようになります。\n",
        "\n",
        "![上限](https://drive.google.com/uc?export=view&id=1xxg5yM-wgNkAr1FboAM8DS2K-aqmtw5d)\n"
      ],
      "metadata": {
        "id": "Ma1e14jVToVi"
      }
    },
    {
      "cell_type": "markdown",
      "source": [
        "## 環境のクラッシュ"
      ],
      "metadata": {
        "id": "NrT6jPFBTq_x"
      }
    },
    {
      "cell_type": "markdown",
      "source": [
        "下記のようなエラーが出た場合、環境がクラッシュしました。\n",
        "\n",
        "セッションを一度削除して、環境を作り直してください\n",
        "\n",
        "![クラッシュ](https://drive.google.com/uc?export=view&id=1qMoxfUggI_jDjrDifj7UgOrSmsEOMmHY)\n",
        "\n",
        "![クラッシュ](https://drive.google.com/uc?export=view&id=1WFHmCzEkCLi8XnHyl7goicNQPL67RHhX)\n",
        "\n",
        "![削除](https://drive.google.com/uc?export=view&id=12UaonO4UvI_HCnJI95od15_yagVIVsRD)\n",
        "\n",
        "![削除](https://drive.google.com/uc?export=view&id=1smRW97KjP8fqSy3E5dtfWJHpyBtEMKca)\n"
      ],
      "metadata": {
        "id": "TYONV48qTtSf"
      }
    },
    {
      "cell_type": "markdown",
      "source": [
        "## 環境の自動削除"
      ],
      "metadata": {
        "id": "n0N0LWYnTw0k"
      }
    },
    {
      "cell_type": "markdown",
      "source": [
        "下記のようなエラーが出た場合、時間経過や上記クラッシュなどによりColabから環境が既に破棄されています。\n",
        "\n",
        "セッションを一度削除して、環境を作り直してください\n",
        "\n",
        "![Googleドライブ連携](https://drive.google.com/uc?export=view&id=1Oa5SNwStqzR6qVMEzxg8PdLmO3FTpr1l)\n"
      ],
      "metadata": {
        "id": "ywNefafZTyy8"
      }
    },
    {
      "cell_type": "markdown",
      "source": [
        "## GPU未使用警告"
      ],
      "metadata": {
        "id": "P-eZr-2ST1bk"
      }
    },
    {
      "cell_type": "markdown",
      "source": [
        "作業中に下記のような警告が出ることがありますが、そのまま進めていただいて問題ありません\n",
        "\n",
        "　（GPUを使うのはAIを実行する箇所だけですので、その他のセルを作業中に出る可能性があります。）\n",
        "\n",
        "![警告](https://drive.google.com/uc?export=view&id=1mRW32urnPQ4LS4xrLEoPdp_XCqlq1HUF)\n"
      ],
      "metadata": {
        "id": "v28ncAfzT3db"
      }
    },
    {
      "cell_type": "markdown",
      "source": [
        "## ディスク容量残警告"
      ],
      "metadata": {
        "id": "uH6cRFVgmfh4"
      }
    },
    {
      "cell_type": "markdown",
      "source": [
        "下記のような警告が出てきたら、1回目は無視して大丈夫です。\n",
        "\n",
        "2回目が出てきたら、途中でディスクがパンクする恐れがあるため、入力映像をキリのいいところで区切って分けて処理してください。"
      ],
      "metadata": {
        "id": "cUxpejEEmlKM"
      }
    },
    {
      "cell_type": "markdown",
      "source": [
        "\n",
        "![容量オーバー](https://drive.google.com/uc?export=view&id=1EKt3nCK6ZYjgkNoflQNzSnW_0s4WnJYO)\n",
        "\n"
      ],
      "metadata": {
        "id": "Hae7pvkCmdps"
      }
    },
    {
      "cell_type": "markdown",
      "source": [
        "# 利用規約"
      ],
      "metadata": {
        "id": "tUNmRfXodyvM"
      }
    },
    {
      "cell_type": "markdown",
      "source": [
        "MMD自動トレースをご利用、またはその結果を公開・配布する場合は、必ず利用規約のご確認をお願い致します。\n",
        "\n",
        "JSONデータの利用やUnityへの適用等、MMD以外での使用の場合も同様です。\n",
        "\n",
        "[MMD自動トレースv3 利用規約](https://github.com/miu200521358/mmd-auto-trace-3/wiki/03.%E5%88%A9%E7%94%A8%E8%A6%8F%E7%B4%84)\n",
        "\n",
        "[MMD自動トレースv3 使用技術・ライセンス](https://github.com/miu200521358/mmd-auto-trace-3/wiki/02.%E4%BD%BF%E7%94%A8%E6%8A%80%E8%A1%93)"
      ],
      "metadata": {
        "id": "UqHhDeUAUA3V"
      }
    },
    {
      "cell_type": "markdown",
      "source": [
        "# ①　環境構築"
      ],
      "metadata": {
        "id": "cGNYDeTFeFWW"
      }
    },
    {
      "cell_type": "markdown",
      "source": [
        "## ①-A　通知音のダウンロード\n",
        "\n",
        "通知音を[効果音ラボ](https://soundeffect-lab.info/)様よりダウンロードして、セルの実行を開始・完了・失敗した時に音が鳴るようにします。\n",
        "\n",
        "下の【①-A】のセルを実行してください\n",
        "\n"
      ],
      "metadata": {
        "id": "c2wqFlb4eTe2"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "#@markdown ■■■■■■■■■■■■■■■■■■\n",
        "\n",
        "#@markdown 【①-A】　通知音のダウンロード\n",
        "\n",
        "#@markdown ■■■■■■■■■■■■■■■■■■\n",
        "\n",
        "from enum import Enum\n",
        "\n",
        "class SoundType(Enum):\n",
        "    START = 0\n",
        "    SUCCESS = 1\n",
        "    FAIL = 2\n",
        "\n",
        "# ----------------------------------\n",
        "\n",
        "! wget --no-check-certificate -c \"https://soundeffect-lab.info/sound/anime/mp3/sceneswitch1.mp3\"\n",
        "! wget --no-check-certificate -c \"https://soundeffect-lab.info/sound/anime/mp3/incorrect1.mp3\"\n",
        "! wget --no-check-certificate -c \"https://soundeffect-lab.info/sound/anime/mp3/switch1.mp3\"\n",
        "\n",
        "from IPython.display import Audio, display\n",
        "import torch\n",
        "\n",
        "def play_sound(sound_type: SoundType, autoplay=True):\n",
        "    try:\n",
        "        if sound_type == SoundType.START:\n",
        "            file_name = \"/content/switch1.mp3\"\n",
        "        elif sound_type == SoundType.SUCCESS:\n",
        "            file_name = \"/content/sceneswitch1.mp3\"\n",
        "        else:\n",
        "            file_name = \"/content/incorrect1.mp3\"\n",
        "\n",
        "        display(Audio(file_name, autoplay=autoplay, normalize=False))\n",
        "    except:\n",
        "        print(\"■■■■■■■■■■■■■■■\")\n",
        "        print(\"■　効果音が再生できませんでした\")\n",
        "        print(\"■■■■■■■■■■■■■■■\")\n",
        "\n",
        "# ----------------------------------\n",
        "\n",
        "exec_dict = {\n",
        "    '①-A': {'exec': False, 'premise': []},\n",
        "    '①-B': {'exec': False, 'premise': ['①-A', ]},\n",
        "    '①-C': {'exec': False, 'premise': ['①-A', '①-B', ]},\n",
        "    '①-D': {'exec': False, 'premise': ['①-A', '①-B', '①-C', ]},\n",
        "    '①-E': {'exec': False, 'premise': ['①-A', '①-B', '①-C', '①-D', ]},\n",
        "    '①-F': {'exec': False, 'premise': ['①-A', '①-B', '①-C', '①-D', '①-E', ]},\n",
        "    '②-A': {'exec': False, 'premise': ['①-A', '①-B', '①-C', '①-D', '①-E', '①-F', ]},\n",
        "    '②-B': {'exec': False, 'premise': ['①-A', '①-B', '①-C', '①-D', '①-E', '①-F', '②-A' ]},\n",
        "}\n",
        "\n",
        "NVIDIA_VISIBLE_DEVICES=all\n",
        "\n",
        "class IpyExit(SystemExit):\n",
        "    def __init__(self, text: str = None):\n",
        "        if text:\n",
        "            print(\"■■■■■■■■■■■■■■■\")\n",
        "            print(\"■　** ERROR **\")\n",
        "            print(f\"■　{text}\")\n",
        "            print(\"■■■■■■■■■■■■■■■\")\n",
        "        play_sound(SoundType.FAIL)\n",
        "        pass\n",
        "\n",
        "def check_exec_dict(cell_key: str):\n",
        "    if not torch.cuda.is_available():\n",
        "        print(\"■■■■■■■■■■■■■■■\")\n",
        "        print(\"■　** ERROR **\")\n",
        "        print(\"■　GPUが有効になってません。\")\n",
        "        print(\"■　準備編を参考にしながらランタイムをGPUに変更してください。\")\n",
        "        print(\"■■■■■■■■■■■■■■■\")\n",
        "        raise IpyExit\n",
        "\n",
        "    if not exec_dict:\n",
        "        print(\"■■■■■■■■■■■■■■■\")\n",
        "        print(\"■　** ERROR **\")\n",
        "        print(\"■　セル【①-A】が実行されていない可能性があります。\")\n",
        "        print(\"■　目次から戻って実行してください。\")\n",
        "        print(\"■■■■■■■■■■■■■■■\")\n",
        "        raise IpyExit\n",
        "\n",
        "    for p in exec_dict[cell_key]['premise']:\n",
        "        # 事前に実行されるべきセルがすべて実行されているか\n",
        "        if not exec_dict[p]['exec']:\n",
        "            print(\"■■■■■■■■■■■■■■■\")\n",
        "            print(\"■　** ERROR **\")\n",
        "            print(f\"■　セル【{p}】が実行されていない可能性があります。\")\n",
        "            print(\"■　目次から戻って実行してください。\")\n",
        "            print(\"■■■■■■■■■■■■■■■\")\n",
        "            raise IpyExit\n",
        "\n",
        "    # 全部実行されていたらOK\n",
        "    play_sound(SoundType.START)\n",
        "    return True\n",
        "\n",
        "def finish_cell(cell_key: str):\n",
        "    play_sound(SoundType.SUCCESS)\n",
        "\n",
        "    print(\"■■■■■■■■■■■■■■■\")\n",
        "    print(\"■　** OK **\")\n",
        "    print(f\"■　セル【{cell_key}】の実行に成功しました。\")\n",
        "    print(\"■■■■■■■■■■■■■■■\")\n",
        "\n",
        "    exec_dict[cell_key]['exec'] = True\n",
        "\n",
        "# ----------------------------------\n",
        "\n",
        "# セル実行可否\n",
        "ckey = \"①-A\"\n",
        "check_exec_dict(ckey)\n",
        "\n",
        "# ----------------------------------\n",
        "\n",
        "# セル終了\n",
        "\n",
        "finish_cell(ckey)\n",
        "\n",
        "print(\"\")\n",
        "print(\"\")\n",
        "print(\"■ セル実行開始\")\n",
        "play_sound(SoundType.START, autoplay=False)\n",
        "\n",
        "print(\"\")\n",
        "print(\"\")\n",
        "print(\"■ セル実行失敗\")\n",
        "play_sound(SoundType.FAIL, autoplay=False)\n",
        "\n",
        "print(\"\")\n",
        "print(\"\")\n",
        "print(\"■ セル実行成功\")\n",
        "play_sound(SoundType.SUCCESS, autoplay=False)"
      ],
      "metadata": {
        "cellView": "form",
        "id": "ENPQ2HkzeZdl"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "source": [
        "## ①-B　GPUランタイムの確認\n",
        "\n",
        "ヘッダの \"ランタイム\"　＞　\"ランタイムのタイプを変更\"　＞　\"GPU\"　を選択して下さい。\n",
        "\n",
        "詳しい手順は、「[MMD自動トレース 準備編](https://colab.research.google.com/github/miu200521358/motion_trace_colab/blob/master/AutoTraceIntroduction.ipynb)」を参考にしてください。\n",
        "\n",
        "変更できたら、下の【①-B】のセルを実行して下さい。"
      ],
      "metadata": {
        "id": "WKqIyaMoe2wP"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "#@markdown ■■■■■■■■■■■■■■■■■■\n",
        "\n",
        "#@markdown 【①-B】　GPUランタイムの確認\n",
        "\n",
        "#@markdown ■■■■■■■■■■■■■■■■■■\n",
        "\n",
        "# セル実行可否\n",
        "ckey = \"①-B\"\n",
        "check_exec_dict(ckey)\n",
        "\n",
        "# ----------------------------------\n",
        "\n",
        "# OSバージョンとかもログに出す\n",
        "! cat /etc/os-release\n",
        "\n",
        "! nvidia-smi\n",
        "\n",
        "import subprocess\n",
        "try:\n",
        "    subprocess.check_output(\"nvidia-smi\", shell=True)\n",
        "except:\n",
        "    print(\"■■■■■■■■■■■■■■■\")\n",
        "    print(\"■　** ERROR **\")\n",
        "    print(\"■　nvidia-smiコマンドの実行に失敗しました。\")\n",
        "    print(\"■　① まだGPUを使ってない場合、ランタイムの設定を行っていない場合\")\n",
        "    print(\"■　　準備編を参考にしながら、ランタイムをGPUに設定してください\")\n",
        "    print(\"■　　※ランタイムを変更すると環境がリセットされるため、【①-A】からやり直してください\")\n",
        "    print(\"■　② GPUの利用上限に達して、CPUでしか使えない場合\")\n",
        "    print(\"■　　無料域の場合、24時間以上置いていただくと再度使用できるようになります\")\n",
        "    print(\"■■■■■■■■■■■■■■■\")\n",
        "\n",
        "# ----------------------------------\n",
        "\n",
        "# セル終了\n",
        "finish_cell(ckey)"
      ],
      "metadata": {
        "cellView": "form",
        "id": "_dGYRo6Me7Df"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "source": [
        "## ①-C　Googleドライブとの連携\n",
        "\n",
        "下記目的のため、このColabページからあなたのGoogleドライブにアクセスする許可を与えてください。\n",
        " - Googleドライブに保存されたトレース元動画を読み取る為\n",
        " - 自動トレース結果を保存する為\n",
        "\n",
        "※Googleドライブ内の「autotrace」フォルダ以外は触りません\n",
        "\n",
        "下の【①-C】のセルを実行して、サブウィンドウから連携を許可してください。\n",
        "\n",
        "（最新のColabだと、キーのコピペ処理は不要になりました）"
      ],
      "metadata": {
        "id": "WfRS49WpfC0a"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "#@markdown ■■■■■■■■■■■■■■■■■■\n",
        "\n",
        "#@markdown 【①-C】　Googleドライブとの連携\n",
        "\n",
        "#@markdown ■■■■■■■■■■■■■■■■■■\n",
        "\n",
        "# セル実行可否\n",
        "ckey = \"①-C\"\n",
        "check_exec_dict(ckey)\n",
        "\n",
        "# ----------------------------------\n",
        "\n",
        "from google.colab import drive\n",
        "import os\n",
        "\n",
        "# Googleドライブマウント\n",
        "drive.mount('/gdrive')\n",
        "\n",
        "# 起点ディレクトリ\n",
        "base_dir_path = \"/gdrive/My Drive/autotrace\"\n",
        "\n",
        "if os.path.exists(base_dir_path):\n",
        "    print(\"■■■■■■■■■■■■■■■\")\n",
        "    print(\"■　** OK **\")\n",
        "    print(\"■　autotraceフォルダ内との連携が成功しました。\")\n",
        "    print(\"■■■■■■■■■■■■■■■\")\n",
        "else:\n",
        "    print(\"■■■■■■■■■■■■■■■\")\n",
        "    print(\"■　** ERROR **\")\n",
        "    print(\"■　autotraceフォルダがGoogleドライブの直下に見つかりませんでした。\")\n",
        "    print(\"■　準備編を参考にしながら、autotraceフォルダを作成してください。\")\n",
        "    print(\"■　※スペルミスだった場合、ファイル名などの変更は行わず、新しいフォルダもしくはファイルで試してください。\")\n",
        "    print(\"■　　Googleドライブとの連携後の更新はうまく認識されません。\")\n",
        "    print(\"■　※少しタイムラグがあるので、修正した直後は認識されない場合があります。\")\n",
        "    print(\"■　　10秒くらい待ってからセルを再実行してください。\")\n",
        "    print(\"■■■■■■■■■■■■■■■\")\n",
        "    raise IpyExit\n",
        "\n",
        "# ----------------------------------\n",
        "\n",
        "# セル終了\n",
        "finish_cell(ckey)"
      ],
      "metadata": {
        "cellView": "form",
        "id": "QkEaktdxfcqE"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "source": [
        "## ①-D　GoogleSDKとの連携\n",
        "\n",
        "miuのGoogleドライブから自動トレースに必要なデータをDLするため、`GoogleSDK` と連携します。\n",
        "\n",
        "セル【①-C】と同じく、URLからアクセス許可を与えてください。"
      ],
      "metadata": {
        "id": "TAPv-jy7fz4h"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "#@markdown ■■■■■■■■■■■■■■■■■■\n",
        "\n",
        "#@markdown 【①-D】　Google SDK との連携\n",
        "\n",
        "#@markdown ■■■■■■■■■■■■■■■■■■\n",
        "\n",
        "# セル実行可否\n",
        "ckey = \"①-D\"\n",
        "check_exec_dict(ckey)\n",
        "\n",
        "# ----------------------------------\n",
        "\n",
        "# Googleドライブアクセスライブラリ\n",
        "!pip install -U -q PyDrive\n",
        "\n",
        "from pydrive.auth import GoogleAuth\n",
        "from pydrive.drive import GoogleDrive\n",
        "from google.colab import auth\n",
        "from oauth2client.client import GoogleCredentials\n",
        "\n",
        "try:\n",
        "    auth.authenticate_user()\n",
        "    gauth = GoogleAuth()\n",
        "    gauth.credentials = GoogleCredentials.get_application_default()\n",
        "    drive = GoogleDrive(gauth)\n",
        "\n",
        "    print(\"■■■■■■■■■■■■■■■\")\n",
        "    print(\"■　** OK **\")\n",
        "    print(\"■　Google SDK との連携に成功しました。\")\n",
        "    print(\"■■■■■■■■■■■■■■■\")\n",
        "\n",
        "except Exception as e:\n",
        "    print(e.message)\n",
        "    print(\"■■■■■■■■■■■■■■■\")\n",
        "    print(\"■　** Error **\")\n",
        "    print(\"■　Google SDK との連携に失敗しました。\")\n",
        "    print(\"■　このノートブックを作者に共有してください。\")\n",
        "    print(\"■■■■■■■■■■■■■■■\")\n",
        "    raise IpyExit\n",
        "\n",
        "# ----------------------------------\n",
        "\n",
        "# セル終了\n",
        "finish_cell(ckey)"
      ],
      "metadata": {
        "cellView": "form",
        "id": "P51Ag4QigW1q"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "source": [
        "## ①-E　コードセットアップ\n",
        "\n",
        "MMD自動トレースのコードを構築します。\n",
        "\n",
        "下の【①-E】のセルを実行して下さい。\n",
        "\n",
        "たくさんメッセージが出ます。15分くらいかかります。\n",
        "\n",
        "**途中でコンパイルが走るので、動かなくなったように見える箇所があります。**\n",
        "\n",
        "**ビックリしたり心配になって、セルを中断しないようお願いします。そのまま待っていれば終わります。**\n",
        "\n",
        "`ERROR` という文字列が出る場合もありますが、自動トレースを実行するには問題ないエラーの可能性が高いので、一旦無視してそのまま進めて下さい。"
      ],
      "metadata": {
        "id": "8hXO0YvKhLa_"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "#@markdown ■■■■■■■■■■■■■■■■■■\n",
        "\n",
        "#@markdown 【①-E】　コードセットアップ\n",
        "\n",
        "#@markdown ■■■■■■■■■■■■■■■■■■\n",
        "\n",
        "# セル実行可否\n",
        "ckey = \"①-E\"\n",
        "check_exec_dict(ckey)\n",
        "\n",
        "# ----------------------------\n",
        "\n",
        "# 既存ディレクトリの削除  ---------\n",
        "! rm -r mmd-auto-trace-3\n",
        "\n",
        "# 環境変数設定  ---------\n",
        "! DEBIAN_FRONTEND=noninteractive\n",
        "! apt-get update && apt-get install -y  -o Dpkg::Options::=\"--force-confdef\" -o Dpkg::Options::=\"--force-confold\" keyboard-configuration\n",
        "\n",
        "# ライブラリの追加 ---------\n",
        "! sudo apt install libosmesa6-dev build-essential libgl1-mesa-dev libglu1-mesa-dev freeglut3-dev gcc libyaml-dev gcc\n",
        "\n",
        "# CUDA 11.7 のインストール ---------\n",
        "\n",
        "! wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-ubuntu2204.pin\n",
        "! sudo mv cuda-ubuntu2204.pin /etc/apt/preferences.d/cuda-repository-pin-600\n",
        "! wget https://developer.download.nvidia.com/compute/cuda/11.7.0/local_installers/cuda-repo-ubuntu2204-11-7-local_11.7.0-515.43.04-1_amd64.deb\n",
        "! sudo dpkg -i cuda-repo-ubuntu2204-11-7-local_11.7.0-515.43.04-1_amd64.deb\n",
        "! sudo cp /var/cuda-repo-ubuntu2204-11-7-local/cuda-*-keyring.gpg /usr/share/keyrings/\n",
        "! sudo apt-get update\n",
        "!apt-get -y install cuda-11-7\n",
        "\n",
        "# CUDAのPATHを変更 ---------\n",
        "\n",
        "! !ls -d /usr/local/cuda-*\n",
        "\n",
        "import os\n",
        "p = os.getenv('PATH')\n",
        "ld = os.getenv('LD_LIBRARY_PATH')\n",
        "os.environ['PATH'] = f\"/usr/local/cuda-11.7/bin:{p}\"\n",
        "os.environ['LD_LIBRARY_PATH'] = f\"/usr/local/cuda-11.7/lib64:{ld}\"\n",
        "\n",
        "# 再確認ログ ---------\n",
        "! nvcc --version\n",
        "\n",
        "# MMD自動トレースv3 clone  ---------\n",
        "version_tag = \"ver3.00.04\"\n",
        "# version_tag = \"develop\"\n",
        "\n",
        "! git clone  --recursive --depth 1 -b \"$version_tag\" \"https://github.com/miu200521358/mmd-auto-trace-3.git\"\n",
        "\n",
        "# PyTorchのインストール ---------\n",
        "! python -m pip install numpy==1.24.2\n",
        "! python -m pip install torch==1.13.0+cu117 torchvision==0.14.0+cu117 torchaudio==0.13.0 --extra-index-url https://download.pytorch.org/whl/cu117\n",
        "! python -m pip install -r /content/mmd-auto-trace-3/requirements.txt\n",
        "\n",
        "# cocoapi のインストール ---------\n",
        "import os\n",
        "import pathlib\n",
        "\n",
        "# Clone the tensorflow models repository if it doesn't already exist\n",
        "if \"models\" in pathlib.Path.cwd().parts:\n",
        "  while \"models\" in pathlib.Path.cwd().parts:\n",
        "    os.chdir('..')\n",
        "elif not pathlib.Path('models').exists():\n",
        "  !git clone --depth 1 https://github.com/tensorflow/models\n",
        "\n",
        "# Install the cocoapi\n",
        "! cd models/research/ && git clone https://github.com/cocodataset/cocoapi.git && python cocoapi/PythonAPI/setup.py build develop\n",
        "\n",
        "! cd /content/mmd-auto-trace-3/src/chumpy && python setup.py build develop\n",
        "\n",
        "# AlphaPoseのインストール ---------\n",
        "! cd /content/mmd-auto-trace-3/src/AlphaPose && python setup.py build develop\n",
        "! python -m pip install cython_bbox\n",
        "! python -m pip install -r /content/mmd-auto-trace-3/requirements2.txt\n",
        "\n",
        "# ----------------------------\n",
        "\n",
        "# セル終了\n",
        "finish_cell(ckey)"
      ],
      "metadata": {
        "id": "Wm_DfN5bhaCl",
        "cellView": "form"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "source": [
        "## ①-F　データ配置\n",
        "\n",
        "MMD自動トレースに必要なデータを配置します。\n",
        "\n",
        "下の【①-F】のセルを実行して下さい。\n",
        "\n",
        "たくさんメッセージが出ます。2分くらいかかります。"
      ],
      "metadata": {
        "id": "0wpzqPQ4ihVn"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "#@markdown ■■■■■■■■■■■■■■■■■■\n",
        "\n",
        "#@markdown 【①-F】　データ配置\n",
        "\n",
        "#@markdown ■■■■■■■■■■■■■■■■■■\n",
        "\n",
        "# セル実行可否\n",
        "ckey = \"①-F\"\n",
        "check_exec_dict(ckey)\n",
        "\n",
        "# ----------------------------\n",
        "\n",
        "# 3d-multi-pose-pose.zip\n",
        "downloaded = drive.CreateFile({'id': '1LtUFDGOSLW52qQwg59azrJxOfXTCtFDm'})\n",
        "downloaded.GetContentFile('/content/mmd-auto-trace-3/data/3d-multi-pose-pose.zip')\n",
        "! cd mmd-auto-trace-3/data && unzip -o ./3d-multi-pose-pose.zip\n",
        "\n",
        "# alphapose.zip\n",
        "downloaded = drive.CreateFile({'id': '16MITkRde9HVyr-6CVC55PkEYlTokwdG_'})\n",
        "downloaded.GetContentFile('/content/mmd-auto-trace-3/data/alphapose.zip')\n",
        "! cd mmd-auto-trace-3/data && unzip -o ./alphapose.zip\n",
        "\n",
        "# posetriplet.zip\n",
        "downloaded = drive.CreateFile({'id': '1Z_L0bq78sA66piDbcP3OEMPv0pImdrHU'})\n",
        "downloaded.GetContentFile('/content/mmd-auto-trace-3/data/posetriplet.zip')\n",
        "! cd mmd-auto-trace-3/data && unzip -o ./posetriplet.zip\n",
        "\n",
        "# ----------------------------\n",
        "\n",
        "# セル終了\n",
        "finish_cell(ckey)"
      ],
      "metadata": {
        "cellView": "form",
        "id": "VGB11PgjisJ1"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "source": [
        "# ②　MMD自動トレースv3 実行"
      ],
      "metadata": {
        "id": "5ek2ZWYJkMqb"
      }
    },
    {
      "cell_type": "markdown",
      "source": [
        "## ②-A　トレース元動画配置\n",
        "\n",
        "トレースを行いたい動画ファイルを、準備してください。\n",
        "\n",
        " - ファイル名は **半角英数字のみ** にしてください。opencvは2バイト文字を読み込めません。\n",
        " - あまり長い動画はディスク容量が足りなくなります。6000fを超える場合、分割してください。\n",
        " - Googleドライブの **autotrace** フォルダ 直下に置いてください。\n",
        " - **マウント後のGooleドライブ上のファイルの上書きや更新は正しく認識されません。** 新しいファイルは新規の名前でアップロードしてから処理して下さい。\n",
        " - 入力するのは、ファイル名（拡張子含む）のみです。\n",
        " - ファイルをアップロードできたら、下の【②-A】のセルを実行して下さい。"
      ],
      "metadata": {
        "id": "30ajJ1K3kW69"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "#@markdown ■■■■■■■■■■■■■■■■■■\n",
        "\n",
        "#@markdown 【②-A】　トレース元動画配置\n",
        "\n",
        "#@markdown ■■■■■■■■■■■■■■■■■■\n",
        "\n",
        "# セル実行可否\n",
        "ckey = \"②-A\"\n",
        "check_exec_dict(ckey)\n",
        "\n",
        "# ----------------------------\n",
        "\n",
        "input_video_name = \"input.mp4\"  #@param {type: \"string\"}\n",
        "\n",
        "import os\n",
        "input_video_path = os.path.join(base_dir_path, input_video_name)\n",
        "\n",
        "if not os.path.exists(input_video_path):\n",
        "    print(\"■■■■■■■■■■■■■■■\")\n",
        "    print(\"■　** ERROR **\")\n",
        "    print(\"■　autotrace 直下に 指定動画 が見つかりませんでした。\")\n",
        "    print(\"■　・マイドライブ > 「autotrace」フォルダ > 指定画像 の順番でファイルが配置されているか再確認してください\")\n",
        "    print(\"■　・配置した直後だと、認識が間に合わない場合がありますので、10秒ほど待ってから再度実行してください\")\n",
        "    print(\"■　ファイルパス: \" + input_video_path)\n",
        "    print(\"■■■■■■■■■■■■■■■\")\n",
        "    raise IpyExit\n",
        "else:\n",
        "    ! cp \"$input_video_path\" .\n",
        "\n",
        "    input_video_path = f\"/content/{input_video_name}\"\n",
        "\n",
        "    print(\"■■■■■■■■■■■■■■■\")\n",
        "    print(\"■　** OK **\")\n",
        "    print(\"■　トレース元動画の配置が完了しました。\")\n",
        "    print(\"■　ファイルパス: \" + input_video_path)\n",
        "    print(\"■■■■■■■■■■■■■■■\")\n",
        "\n",
        "\n",
        "# ----------------------------\n",
        "\n",
        "# セル終了\n",
        "finish_cell(ckey)"
      ],
      "metadata": {
        "cellView": "form",
        "id": "625x35Vaky9I"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "source": [
        "## ②-B　MMD自動トレースv3 実行\n",
        "\n",
        "トレース元動画に対して、MMD自動トレースを実行します。\n",
        "\n",
        "1人の動画1分につき、20分ほどかかります。\n",
        "\n",
        "トレースが終了すると、Googleドライブの `autotrace` フォルダにトレース結果を保存します。"
      ],
      "metadata": {
        "id": "9Tinu8_mlnzN"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "#@markdown ■■■■■■■■■■■■■■■■■■\n",
        "\n",
        "#@markdown 【②-B】　MMD自動トレースv3 実行\n",
        "\n",
        "#@markdown ■■■■■■■■■■■■■■■■■■\n",
        "\n",
        "# セル実行可否\n",
        "ckey = \"②-B\"\n",
        "check_exec_dict(ckey)\n",
        "\n",
        "# ----------------------------\n",
        "\n",
        "# import torch\n",
        "# torch.multiprocessing.set_sharing_strategy(\"file_descriptor\")\n",
        "# torch.multiprocessing.set_start_method('spawn')\n",
        "\n",
        "import datetime\n",
        "process_img_dir_name = f\"{os.path.basename(input_video_path).replace('.', '_')}_{datetime.datetime.now():%Y%m%d_%H%M%S}\"\n",
        "process_img_dir_path = os.path.join('/content/output', process_img_dir_name)\n",
        "os.makedirs(process_img_dir_path, exist_ok=True)\n",
        "\n",
        "! cd /content/mmd-auto-trace-3/src && python executor.py --video-file \"$input_video_path\" --parent-dir \"$process_img_dir_path\" --process prepare,alphapose,multipose,posetriplet,mix,motion --verbose 20 --log-mode 0 --lang ja\n",
        "\n",
        "import os\n",
        "if os.path.exists(\"/content/mmd-auto-trace-3/log/quit.log\"):\n",
        "    raise IpyExit(\"MMD自動トレースが予期せぬエラーで失敗しました\")\n",
        "\n",
        "# 結果をGoogleドライブにコピー\n",
        "output_path = os.path.join(base_dir_path, process_img_dir_name)\n",
        "os.makedirs(output_path, exist_ok=True)\n",
        "\n",
        "import shutil\n",
        "\n",
        "# alphapose.mp4\n",
        "shutil.copy(os.path.join(process_img_dir_path, \"02_alphapose\", \"alphapose.mp4\"), os.path.join(output_path, \"alphapose.mp4\"))\n",
        "\n",
        "# mix(json)\n",
        "shutil.copytree(os.path.join(process_img_dir_path, \"05_mix\"), os.path.join(output_path, \"01_json\"))\n",
        "\n",
        "# viz_pos.html\n",
        "shutil.copy(os.path.join(\"/content/mmd-auto-trace-3/data/viz_pos.html\"), os.path.join(output_path, \"01_json\", \"viz_pos.html\"))\n",
        "\n",
        "# motion(vmd)\n",
        "shutil.copytree(os.path.join(process_img_dir_path, \"06_motion\"), os.path.join(output_path, \"02_motion\"))\n",
        "\n",
        "os.makedirs(os.path.join(output_path, \"trace_model\"))\n",
        "\n",
        "# pmx\n",
        "shutil.copy(os.path.join(\"/content/mmd-auto-trace-3/data/pmx/trace_model.pmx\"), os.path.join(output_path, \"trace_model\", \"trace_model.pmx\"))\n",
        "\n",
        "# pmx(tex)\n",
        "shutil.copytree(\"/content/mmd-auto-trace-3/data/pmx/tex\", os.path.join(output_path, \"trace_model/tex\"))\n",
        "\n",
        "# readme\n",
        "shutil.copy(os.path.join(\"/content/mmd-auto-trace-3/data/readme_ja.txt\"), os.path.join(output_path, \"readme.txt\"))\n",
        "\n",
        "# ----------------------------\n",
        "\n",
        "# セル終了\n",
        "finish_cell(ckey)"
      ],
      "metadata": {
        "id": "Q32Z-oOqlZLd",
        "cellView": "form"
      },
      "execution_count": null,
      "outputs": []
    }
  ]
}